Markdown instruction

This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

Import Library

#install.packages("dplyr")
library(ggplot2)
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(corrplot)
corrplot 0.92 loaded
library(readxl)
library(lmtest) 
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric
library(forecast)
library(DIMORA)
Loading required package: minpack.lm
Loading required package: numDeriv
Loading required package: reshape2
Loading required package: deSolve
library(fpp2)
── Attaching packages ────────────────────────────────────────────────────────────────────────── fpp2 2.5 ──
✔ fma       2.5     ✔ expsmooth 2.3

Data upload

btc_price <- read.csv("BTC_price_Bitcoin.csv", sep=",", header = TRUE) # daily
dollar_circulation <- read.csv("CURRCIR.csv", sep=",", header = TRUE) # monthly
btc_addr_total <- read.csv("BTC_Total Addresses_Bitcoin.csv", sep=",", header = TRUE) # daily
btc_hashrate_difficulty <- read.csv("BTC_Hash Rate_Difficulty.csv", sep=",", header = TRUE) # daily
btc_transaction <- read.csv("BTC_Number of Transactions_Bitcoin.csv", sep=",", header = TRUE) # daily
btc_miner_rewards <- read.csv("BTC_Miner Rewards_undefined.csv", sep=",", header = TRUE) # daily

btc_avg_fees <- read.csv("BTC_Average Transaction Fees_Bitcoin.csv", sep=",", header = TRUE) # daily not null from 29/11/09
btc_days_halving <- read.csv("days_to_halving.csv", sep=",", header = TRUE) # daily

Function

# Normalize data
norm <- function(lista_numeri) {
  # Calcola il minimo e il massimo della lista
  minimo <- min(lista_numeri)
  massimo <- max(lista_numeri)
  
  # Normalizza la lista tra 0 e 1
  lista_normalizzata <- (lista_numeri - minimo) / (massimo - minimo)
  
  # Restituisci la lista normalizzata
  return(lista_normalizzata)
}
# From daily to monthly
monthly <- function(data, col_date) {
  # Assicurati che la colonna 'DateTime' sia di tipo Date
  data[[col_date]] <- as.Date(data[[col_date]], format = "%Y-%m-%dT%H:%M:%S.000Z")
  
  # Estrai il mese dalla colonna 'DateTime'
  data <- data %>%
    mutate(Month = format(get(col_date), "%Y-%m"))
  
  # Seleziona solo colonne numeriche per calcolare la media
  cols_num <- names(data)[sapply(data, is.numeric)]
  
  # Calcola la media delle colonne numeriche per ogni mese
  new_dataset <- data %>%
    group_by(Month) %>%
    summarise(across(all_of(cols_num), mean))
  
  new_dataset$Month <- as.Date(paste(new_dataset$Month, "01", sep = "-"))
  
  # Restituisci il nuovo dataset
  return(new_dataset)
}

EDA

From day to month

btc_price <- monthly(btc_price, "DateTime")
btc_addr_total <- monthly(btc_addr_total, "DateTime")
btc_hashrate_difficulty <- monthly(btc_hashrate_difficulty, "DateTime")
btc_transaction <- monthly(btc_transaction, "DateTime")
btc_miner_rewards <- monthly(btc_miner_rewards, "DateTime")
btc_avg_fees <- monthly(btc_avg_fees, "DateTime")
#btc_days_halving <- monthly(btc_days_halving, "date")

Global date

start_date <- as.Date("2011-09-01") # 2011-09-01
end_date <- as.Date("2023-10-01") # 2023-10-01

Date

btc_price <- btc_price[btc_price$Month >= start_date & btc_price$Month <= end_date, ] # price
dollar_circulation <- dollar_circulation[dollar_circulation$DATE >= start_date & dollar_circulation$DATE <= end_date, ] # price
btc_addr_total <- btc_addr_total[btc_addr_total$Month >= start_date & btc_addr_total$Month <= end_date, ] # price
btc_hashrate_difficulty <- btc_hashrate_difficulty[btc_hashrate_difficulty$Month >= start_date & btc_hashrate_difficulty$Month <= end_date, ] # price
btc_transaction <- btc_transaction[btc_transaction$Month >= start_date & btc_transaction$Month <= end_date, ] # price

btc_miner_rewards <- btc_miner_rewards[btc_miner_rewards$Month >= start_date & btc_miner_rewards$Month <= end_date, ] # price

Error in btc_miner_rewards

nrows <- nrow(btc_miner_rewards)
row_pre <- btc_miner_rewards[(nrows - 29):(nrows - 15), -1]
btc_miner_rewards[(nrows - 14):nrows, -1] <- row_pre

Log Data

btc_price$log_Price <- log(btc_price$Price)
dollar_circulation$log_CURRCIR <- log(dollar_circulation$CURRCIR)
btc_addr_total$log_total <- log(btc_addr_total$Total.With.Balance)
btc_hashrate_difficulty$log_HashRate <- log(btc_hashrate_difficulty$Hash.Rate)
btc_transaction$log_transaction <- log(btc_transaction$Number.Of.Transactions)
btc_miner_rewards$log_Rewards <- log(btc_miner_rewards$Rewards)

Plot

ggplot(btc_price, aes(x = Month, y = log_Price)) +
  geom_line(color = "orange", size = 1) +
  labs(x = "Date", y = "Price Bitcoin", title = "Bitcoin price over time")
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
Please use `linewidth` instead.

Plot

ggplot() +
  geom_line(data = btc_price, aes(x = Month, y = norm(log_Price)), color = "orange", size = 1, linetype = "solid") +
  geom_line(data = dollar_circulation, aes(x = as.Date(DATE), y = norm(log_CURRCIR)), color = "red", size = 0.2, linetype = "solid") +
  geom_line(data = btc_addr_total, aes(x = Month, y = norm(log_total)), color = "green", size = 0.2, linetype = "solid") +
  geom_line(data = btc_transaction, aes(x = Month, y = norm(log_transaction)), color = "black", size = 0.2, linetype = "solid") +
  geom_line(data = btc_hashrate_difficulty, aes(x = Month, y = norm(log_HashRate)), color = "blue", size = 0.2, linetype = "solid") +
  geom_line(data = btc_miner_rewards, aes(x = Month, y = norm(log_Rewards)), color = "blue", size = 0.2, linetype = "solid") +

  labs(x = "Date", y = "Log(Price)", title = "Bitcoin Price and other Time Series") +
  scale_linetype_manual(name = "Legend", values = c("solid", "dashed"), labels = c("Bitcoin Price", "Another Time Series"))

Create Dataset

dataset_log <- data.frame(price = btc_price$log_Price, 
                      dollar_circulation = dollar_circulation$log_CURRCIR,
                      total_addr = btc_addr_total$log_total,
                      transaction = btc_transaction$log_transaction,
                      hashrate = btc_hashrate_difficulty$log_HashRate,
                      rewards = btc_miner_rewards$log_Rewards)

dataset <- data.frame(price = btc_price$Price, 
                      dollar_circulation = dollar_circulation$CURRCIR,
                      total_addr = btc_addr_total$Total.With.Balance,
                      transaction = btc_transaction$Number.Of.Transactions,
                      hashrate = btc_hashrate_difficulty$Hash.Rate,
                      rewards = btc_miner_rewards$Rewards)
acf(dataset$price)

mat <- cor(dataset)

corrplot(mat, method = "color", addCoef.col = "black")

Differentation

dataset$price_diff <- c(NA, diff(dataset$price))
dataset$dollar_circulation_diff <- c(NA, diff(dataset$dollar_circulation))
dataset$total_addr_diff <- c(NA, diff(dataset$total_addr))
dataset$transaction_diff <- c(NA, diff(dataset$transaction))
dataset$hashrate_diff <- c(NA, diff(dataset$hashrate))
dataset$rewards_diff <- c(NA, diff(dataset$rewards))
# Rimuovi le variabili temporali originali
dataset_senza_tempo <- subset(dataset, select = -c(price, dollar_circulation, total_addr, transaction, hashrate, rewards))
# Calcola la matrice di correlazione
matrix_correlazione <- cor(dataset_senza_tempo, use = "complete.obs")
# Visualizza la matrice di correlazione
print(matrix_correlazione)
                        price_diff dollar_circulation_diff total_addr_diff transaction_diff hashrate_diff
price_diff              1.00000000              0.06055474     0.229407118       0.15074382    0.29163970
dollar_circulation_diff 0.06055474              1.00000000     0.101964436      -0.04758256   -0.11206328
total_addr_diff         0.22940712              0.10196444     1.000000000       0.20045376    0.06110231
transaction_diff        0.15074382             -0.04758256     0.200453760       1.00000000    0.03003450
hashrate_diff           0.29163970             -0.11206328     0.061102310       0.03003450    1.00000000
rewards_diff            0.01177412             -0.06658894    -0.002962721       0.01710025    0.03394439
                        rewards_diff
price_diff               0.011774119
dollar_circulation_diff -0.066588944
total_addr_diff         -0.002962721
transaction_diff         0.017100247
hashrate_diff            0.033944391
rewards_diff             1.000000000
corrplot(matrix_correlazione, method = "color", addCoef.col = "black")

Linear Regression

price <- log(dataset$price)
tt <- 1:NROW(dataset)

plot(tt, price, xlab="Time", ylab="Bitcoin price")

autocorrelation function

acf(price)

fit a linear regression model

fit1 <- lm(price~ tt)
summary(fit1)

Call:
lm(formula = price ~ tt)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.11319 -0.35944  0.01361  0.64569  2.17326 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.923081   0.159401   18.34   <2e-16 ***
tt          0.060502   0.001881   32.16   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9581 on 144 degrees of freedom
Multiple R-squared:  0.8778,    Adjusted R-squared:  0.8769 
F-statistic:  1034 on 1 and 144 DF,  p-value: < 2.2e-16
plot(tt, price, xlab="Time", ylab="Bitcoin price")
abline(fit1, col=3)

check the residuals? are they autocorrelated? Test of DW

dwtest(fit1)

    Durbin-Watson test

data:  fit1
DW = 0.062633, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0

check the residuals

resfit1<- residuals(fit1)
plot(resfit1,xlab="Time", ylab="residuals" )

let us do the same with a linear model for time series, so we transform the data into a ‘ts’ object

price.ts <- ts(price, frequency = 4)
ts.plot(price.ts, type="o")


## we fit a linear model with the tslm function
fitts<- tslm(price.ts~trend)

###obviously it gives the same results of the first model
summary(fitts)

Call:
tslm(formula = price.ts ~ trend)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.11319 -0.35944  0.01361  0.64569  2.17326 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.923081   0.159401   18.34   <2e-16 ***
trend       0.060502   0.001881   32.16   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9581 on 144 degrees of freedom
Multiple R-squared:  0.8778,    Adjusted R-squared:  0.8769 
F-statistic:  1034 on 1 and 144 DF,  p-value: < 2.2e-16
dwtest(fitts)

    Durbin-Watson test

data:  fitts
DW = 0.062633, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0

Linear regression with trend and seasonality and forecasting exercise

#take a portion of data and fit a linear model with tslm
price1 <- window(price.ts, start=1, end=31 -.1)
plot(price1)

m1<- tslm(price1 ~ trend+season)
summary(m1)

Call:
tslm(formula = price1 ~ trend + season)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.6729 -0.5493 -0.1696  0.5580  2.3361 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.464363   0.209349  11.772   <2e-16 ***
trend        0.070706   0.002301  30.725   <2e-16 ***
season2     -0.043150   0.225364  -0.191    0.848    
season3     -0.012176   0.225400  -0.054    0.957    
season4      0.033072   0.225458   0.147    0.884    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8728 on 115 degrees of freedom
Multiple R-squared:  0.8916,    Adjusted R-squared:  0.8878 
F-statistic: 236.4 on 4 and 115 DF,  p-value: < 2.2e-16
fit<- fitted(m1)

plot(price1)
lines(fitted(m1), col=2)


fore <- forecast(m1)
plot(fore)

#analysis of residuals
res<- residuals(m1) 
plot(res) 

#the form of residuals seems to indicate the presence of negative autocorrelation
Acf(res)


dw<- dwtest(m1, alt="two.sided")
dw

    Durbin-Watson test

data:  m1
DW = 0.086005, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is not 0

Nonlinear models for new product growth (diffusion models)

bm_tw<-BM(price,display = T)

summary(bm_tw)
Call: ( Standard Bass Model )

  BM(series = price, display = T)

Residuals:
     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-21.2146  -5.5677   0.4326  -1.7988   3.5383   7.2830 

Coefficients:
 
---
 Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

 Residual standard error  7.767938  on  143  degrees of freedom
 Multiple R-squared:   0.999796  Residual sum of squares:  8628.743
pred_bmtw<- predict(bm_tw, newx=c(1:146))
pred.insttw<- make.instantaneous(pred_bmtw)


plot(price, type= "b",xlab="Quarter", ylab="Quarterly revenues",  pch=16, lty=3, cex=0.6, xlim=c(1,146))
lines(pred.insttw, lwd=2, col=2)



###GBMr1
GBMr1tw<- GBM(price,shock = "rett",nshock = 1,prelimestimates = c(4.463368e+04, 1.923560e-03, 9.142022e-02, 24,38,-0.1))



######GBMe1

GBMe1tw<- GBM(price,shock = "exp",nshock = 1,prelimestimates = c(4.463368e+04, 1.923560e-03, 9.142022e-02, 12,0.1,0.1))

summary(GBMe1tw)
Call: ( Generalized Bass model with 1  Exponential  shock )

  GBM(series = price, shock = "exp", nshock = 1, prelimestimates = c(44633.68, 
    0.00192356, 0.09142022, 12, 0.1, 0.1))

Residuals:
     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-5.83499 -2.24663 -0.08100 -0.08908  1.91749  6.93016 

Coefficients:
 
---
 Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

 Residual standard error  3.165267  on  140  degrees of freedom
 Multiple R-squared:   0.99991  Residual sum of squares:  1402.648
pred_GBMe1tw<- predict(GBMe1tw, newx=c(1:146))
pred_GBMe1tw.inst<- make.instantaneous(pred_GBMe1tw)

plot(price, type= "b",xlab="Quarter", ylab="Quarterly revenues",  pch=16, lty=3, cex=0.6, xlim=c(1,146))
lines(pred_GBMe1tw.inst, lwd=2, col=2)

######GGM 
GGM_tw<- GGM(price, prelimestimates=c(4.463368e+04, 0.001, 0.01, 1.923560e-03, 9.142022e-02))
Warning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs produced

summary(GGM_tw)
Call: ( Guseo Guidolin Model )

  GGM(series = price, prelimestimates = c(44633.68, 0.001, 0.01, 
    0.00192356, 0.09142022))

Residuals:
    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-7.3569 -2.6948  0.5882  0.2721  3.2064  8.1475 

Coefficients:
 
---
 Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

 Residual standard error  4.118758  on  141  degrees of freedom
 Multiple R-squared:   0.999847  Residual sum of squares:  2391.947
pred_GGM_tw<- predict(GGM_tw, newx=c(1:146))
pred_GGM_tw.inst<- make.instantaneous(pred_GGM_tw)

plot(price, type= "b",xlab="Quarter", ylab="Quarterly revenues",  pch=16, lty=3, cex=0.6, xlim=c(1,146))
lines(pred_GGM_tw.inst, lwd=2, col=2)
lines(pred.insttw, lwd=2, col=3)


###Analysis of residuals
res_GGMtw<- residuals(GGM_tw)
acf<- acf(residuals(GGM_tw))



fit_GGMtw<- fitted(GGM_tw)
fit_GGMtw_inst<- make.instantaneous(fit_GGMtw)
####SARMAX refining
library(forecast)
####SARMAX model with external covariate 'fit_GGM' 
s2 <- Arima(cumsum(price), order = c(3,0,1), seasonal=list(order=c(3,0,1), period=4),xreg = fit_GGMtw)
summary(s2)
Series: cumsum(price) 
Regression with ARIMA(3,0,1)(3,0,1)[4] errors 

Coefficients:
         ar1      ar2     ar3     ma1     sar1    sar2    sar3    sma1  intercept    xreg
      1.9142  -0.9560  0.0167  0.1962  -0.8595  0.0826  0.0883  0.7991    -0.9844  1.0030
s.e.  0.0203   0.0407  0.0220  0.0558   0.0118  0.0050  0.0057  0.0392     1.3369  0.0024

sigma^2 = 0.04182:  log likelihood = 25.57
AIC=-29.14   AICc=-27.17   BIC=3.67

Training set error measures:
                       ME      RMSE       MAE         MPE      MAPE      MASE        ACF1
Training set 0.0009240674 0.1973691 0.1483844 -0.01038485 0.3713901 0.0200291 0.001633754
pres2 <- make.instantaneous(fitted(s2))


plot(price, type= "b",xlab="Quarter", ylab="Quarterly revenues",  pch=16, lty=3, xaxt="n", cex=0.6)
lines(fit_GGMtw_inst, lwd=1, lty=2)
lines(pres2, lty=1,lwd=1)

ARIMA models

library(fpp2)
── Attaching packages ────────────────────────────────────────────────────────────────────────── fpp2 2.5 ──
✔ ggplot2   3.4.2      ✔ fma       2.5   
✔ forecast  8.21.1     ✔ expsmooth 2.3   
library(forecast) 
?fpp2

plot(price)

Acf(price)

Pacf(price)

pricets<- tsdisplay(price)

###General indication: if the ACF is exponentially decaying or sinusoidal and there is a significant spike at lag p in PACF and nothing else, 
##it may be an ARMA(p,d,0). If the PACF is exponentially decaying or sinusoidal and there is a significant spike at lag p in ACF and nothing else, it may be an ARMA(0,d,q). 

arima1<- Arima(price, order=c(0,0,3))
summary(arima1)
Series: price 
ARIMA(0,0,3) with non-zero mean 

Coefficients:
         ma1     ma2     ma3    mean
      1.7886  1.6759  0.8049  7.3514
s.e.  0.0556  0.0583  0.0531  0.2606

sigma^2 = 0.3742:  log likelihood = -135.94
AIC=281.89   AICc=282.32   BIC=296.81

Training set error measures:
                    ME      RMSE       MAE       MPE     MAPE     MASE      ACF1
Training set 0.0147935 0.6032425 0.4836402 -6.579356 11.83727 2.842824 0.5551343
resid1<- residuals(arima1)
tsdisplay(resid1)



plot(price)
lines(fitted(arima1), col=2)


for1<- forecast(arima1)
plot(for1)

First Arima model

plot(price, ylab="retail index",xlab="year")

tsdisplay(price)


##first difference
diff1<- diff(price) 
###seasonal difference
diff4<- diff(price, lag=4) 
tsdisplay(diff1)

tsdisplay(diff4)



####first Arima model 
a1<- Arima(price, order=c(0,1,1), seasonal=c(0,0,1))
fit1<- fitted(a1)

plot(price)
lines(fit1, col=2)


f1<- forecast(a1)
plot(f1)


r1<- residuals(a1)
tsdisplay(r1) 

Second Arima model

a2<- Arima(price, order=c(0,1,1), seasonal=c(0,0,2))
fit2<- fitted(a2)

plot(price)
lines(fit2, col=2)


f2<- forecast(a2)
plot(f2)


r2<- residuals(a2)
tsdisplay(r2) 

Third Arima model

a3<- Arima(price, order=c(0,1,1), seasonal=c(0,1,1))
fit3<- fitted(a3)

plot(price)
lines(fit3, col=2)


f3<- forecast(a3)
plot(f3)


r3<- residuals(a3)
tsdisplay(r3) 

Fourth Arima model

a4<- Arima(price, order=c(0,1,2), seasonal=c(0,1,1))
fit4<- fitted(a4)

plot(price)
lines(fit4, col=2)


f4<- forecast(a4)
autoplot(f4)


r4<- residuals(a4)
tsdisplay(r4) 

Fifth Arima model

auto.a<- auto.arima(price)
auto.a
Series: price 
ARIMA(1,1,0) with drift 

Coefficients:
         ar1   drift
      0.3878  0.0566
s.e.  0.0778  0.0298

sigma^2 = 0.04939:  log likelihood = 13.26
AIC=-20.52   AICc=-20.35   BIC=-11.59
autoplot(forecast(auto.a))

checkresiduals(auto.a)

    Ljung-Box test

data:  Residuals from ARIMA(1,1,0) with drift
Q* = 22.133, df = 9, p-value = 0.008466

Model df: 1.   Total lags used: 10

##plot of seasonal differentiated data, with ACF and PACF
tsdisplay(diff(price,12), main="seasonal differenced data", xlab="year")


##We fit an ARIMA model base on the inspection of ACF and PACF with 3 AR components
fit<- Arima(price, order=c(3,0,1),seasonal=c(0,1,2), lambda=0)
summary(fit)
Series: price 
ARIMA(3,0,1) with non-zero mean 
Box Cox transformation: lambda= 0 

Coefficients:
         ar1      ar2     ar3     ma1    mean
      1.4137  -0.7747  0.3576  0.1445  1.5330
s.e.  0.1839   0.2713  0.1148  0.1833  0.7488

sigma^2 = 0.003475:  log likelihood = 205.78
AIC=-399.55   AICc=-398.95   BIC=-381.65

Training set error measures:
                     ME      RMSE       MAE       MPE     MAPE    MASE       ACF1
Training set 0.05831207 0.2394853 0.1746367 0.8848972 3.383428 1.02651 -0.2082698
##Check residuals
tsdisplay(residuals(fit))

Box.test(residuals(fit), lag=36,fitdf=6, type="Ljung")

    Box-Ljung test

data:  residuals(fit)
X-squared = 37.175, df = 30, p-value = 0.1721
##perform the forecasting
f<- forecast(fit)

plot(f, ylab="sales", xlab="year")

air.model <- Arima(window(price,end=146),order=c(0,1,1),
                   seasonal=list(order=c(0,1,1),period=12),lambda=0)
plot(forecast(air.model,h=24))
lines(price)


# Apply fitted model to later data
air.model2 <- Arima(window(price,start=1),model=air.model)

# in-sample one-step forecasts
accuracy(air.model)
                      ME      RMSE       MAE        MPE     MAPE     MASE        ACF1
Training set -0.05360399 0.3327414 0.2287816 -0.6502599 3.658534 1.344772 -0.07160046
# out-of-sample one-step forecasts
accuracy(air.model2)
                      ME      RMSE       MAE        MPE     MAPE     MASE        ACF1
Training set -0.05360399 0.3327414 0.2287816 -0.6502599 3.658534 1.344772 -0.07160046

ARMAX Models

armax1<- Arima(price, xreg=dataset_log$dollar_circulation, order=c(1,0,1))
res1<- residuals(armax1)
Acf(res1)


fitted(armax1)
Time Series:
Start = 1 
End = 146 
Frequency = 1 
  [1]  2.091489  1.825582  1.317792  1.079898  1.426339  2.108251  1.679215  1.690872  1.700841  1.731494
 [11]  1.948983  2.201273  2.613059  2.521132  2.626462  2.507943  2.716105  2.849346  3.511862  4.258859
 [21]  5.105274  4.706627  4.698566  4.473554  4.910694  4.952853  5.294621  6.812591  6.613939  6.882095
 [31]  6.082504  6.412056  6.041619  6.232432  6.472638  6.353501  6.222363  6.005696  5.925920  6.000025
 [41]  5.787144  5.436091  5.561916  5.628957  5.423743  5.506027  5.509012  5.728103  5.498019  5.514887
 [51]  5.716613  6.000273  6.108872  6.002581  6.110043  6.053700  6.129470  6.217940  6.607589  6.441679
 [61]  6.372712  6.456957  6.567509  6.666671  6.771188  6.829174  7.180119  7.005705  7.173147  7.720319
 [71]  7.926871  7.805486  8.523932  8.191952  8.763107  9.081779  9.755043  9.236725  9.165211  8.989041
 [81]  9.023974  8.983845  8.728155  8.881322  8.787780  8.763677  8.792990  8.461557  8.134137  8.192134
 [91]  8.275328  8.302494  8.652074  9.025397  9.186619  9.253105  9.284655  9.101616  9.075293  9.000331
[101]  8.845539  9.082660  9.314844  8.943486  9.103742  9.258128  9.212633  9.298374  9.462879  9.266633
[111]  9.518255  9.878156 10.203930 10.539189 10.822939 11.065714 10.913371 10.636783 10.387967 10.451131
[121] 10.825671 10.704060 11.053093 11.011211 10.749139 10.555663 10.722945 10.652860 10.627915 10.297995
[131] 10.056031  9.952615 10.083163  9.867203  9.948428  9.772788  9.772431  9.979983 10.157293 10.189559
[141] 10.353882 10.233927 10.242435 10.315912 10.217728 10.169996
plot(price)
lines(fitted(armax1), col=2)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMgTWFya2Rvd24gaW5zdHJ1Y3Rpb24KClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBXaGVuIHlvdSBleGVjdXRlIGNvZGUgd2l0aGluIHRoZSBub3RlYm9vaywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuIAoKVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkNtZCtTaGlmdCtFbnRlciouIAoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkNtZCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLiAKClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4KCgoKIyMjIEltcG9ydCBMaWJyYXJ5CgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoImRwbHlyIikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGNvcnJwbG90KQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShsbXRlc3QpIApsaWJyYXJ5KGZvcmVjYXN0KQpsaWJyYXJ5KERJTU9SQSkKbGlicmFyeShmcHAyKQpgYGAKCgojIyMgRGF0YSB1cGxvYWQKCmBgYHtyfQpidGNfcHJpY2UgPC0gcmVhZC5jc3YoIkJUQ19wcmljZV9CaXRjb2luLmNzdiIsIHNlcD0iLCIsIGhlYWRlciA9IFRSVUUpICMgZGFpbHkKZG9sbGFyX2NpcmN1bGF0aW9uIDwtIHJlYWQuY3N2KCJDVVJSQ0lSLmNzdiIsIHNlcD0iLCIsIGhlYWRlciA9IFRSVUUpICMgbW9udGhseQpidGNfYWRkcl90b3RhbCA8LSByZWFkLmNzdigiQlRDX1RvdGFsIEFkZHJlc3Nlc19CaXRjb2luLmNzdiIsIHNlcD0iLCIsIGhlYWRlciA9IFRSVUUpICMgZGFpbHkKYnRjX2hhc2hyYXRlX2RpZmZpY3VsdHkgPC0gcmVhZC5jc3YoIkJUQ19IYXNoIFJhdGVfRGlmZmljdWx0eS5jc3YiLCBzZXA9IiwiLCBoZWFkZXIgPSBUUlVFKSAjIGRhaWx5CmJ0Y190cmFuc2FjdGlvbiA8LSByZWFkLmNzdigiQlRDX051bWJlciBvZiBUcmFuc2FjdGlvbnNfQml0Y29pbi5jc3YiLCBzZXA9IiwiLCBoZWFkZXIgPSBUUlVFKSAjIGRhaWx5CmJ0Y19taW5lcl9yZXdhcmRzIDwtIHJlYWQuY3N2KCJCVENfTWluZXIgUmV3YXJkc191bmRlZmluZWQuY3N2Iiwgc2VwPSIsIiwgaGVhZGVyID0gVFJVRSkgIyBkYWlseQoKYnRjX2F2Z19mZWVzIDwtIHJlYWQuY3N2KCJCVENfQXZlcmFnZSBUcmFuc2FjdGlvbiBGZWVzX0JpdGNvaW4uY3N2Iiwgc2VwPSIsIiwgaGVhZGVyID0gVFJVRSkgIyBkYWlseSBub3QgbnVsbCBmcm9tIDI5LzExLzA5CmJ0Y19kYXlzX2hhbHZpbmcgPC0gcmVhZC5jc3YoImRheXNfdG9faGFsdmluZy5jc3YiLCBzZXA9IiwiLCBoZWFkZXIgPSBUUlVFKSAjIGRhaWx5CmBgYAoKRnVuY3Rpb24KYGBge3J9CiMgTm9ybWFsaXplIGRhdGEKbm9ybSA8LSBmdW5jdGlvbihsaXN0YV9udW1lcmkpIHsKICAjIENhbGNvbGEgaWwgbWluaW1vIGUgaWwgbWFzc2ltbyBkZWxsYSBsaXN0YQogIG1pbmltbyA8LSBtaW4obGlzdGFfbnVtZXJpKQogIG1hc3NpbW8gPC0gbWF4KGxpc3RhX251bWVyaSkKICAKICAjIE5vcm1hbGl6emEgbGEgbGlzdGEgdHJhIDAgZSAxCiAgbGlzdGFfbm9ybWFsaXp6YXRhIDwtIChsaXN0YV9udW1lcmkgLSBtaW5pbW8pIC8gKG1hc3NpbW8gLSBtaW5pbW8pCiAgCiAgIyBSZXN0aXR1aXNjaSBsYSBsaXN0YSBub3JtYWxpenphdGEKICByZXR1cm4obGlzdGFfbm9ybWFsaXp6YXRhKQp9CiMgRnJvbSBkYWlseSB0byBtb250aGx5Cm1vbnRobHkgPC0gZnVuY3Rpb24oZGF0YSwgY29sX2RhdGUpIHsKICAjIEFzc2ljdXJhdGkgY2hlIGxhIGNvbG9ubmEgJ0RhdGVUaW1lJyBzaWEgZGkgdGlwbyBEYXRlCiAgZGF0YVtbY29sX2RhdGVdXSA8LSBhcy5EYXRlKGRhdGFbW2NvbF9kYXRlXV0sIGZvcm1hdCA9ICIlWS0lbS0lZFQlSDolTTolUy4wMDBaIikKICAKICAjIEVzdHJhaSBpbCBtZXNlIGRhbGxhIGNvbG9ubmEgJ0RhdGVUaW1lJwogIGRhdGEgPC0gZGF0YSAlPiUKICAgIG11dGF0ZShNb250aCA9IGZvcm1hdChnZXQoY29sX2RhdGUpLCAiJVktJW0iKSkKICAKICAjIFNlbGV6aW9uYSBzb2xvIGNvbG9ubmUgbnVtZXJpY2hlIHBlciBjYWxjb2xhcmUgbGEgbWVkaWEKICBjb2xzX251bSA8LSBuYW1lcyhkYXRhKVtzYXBwbHkoZGF0YSwgaXMubnVtZXJpYyldCiAgCiAgIyBDYWxjb2xhIGxhIG1lZGlhIGRlbGxlIGNvbG9ubmUgbnVtZXJpY2hlIHBlciBvZ25pIG1lc2UKICBuZXdfZGF0YXNldCA8LSBkYXRhICU+JQogICAgZ3JvdXBfYnkoTW9udGgpICU+JQogICAgc3VtbWFyaXNlKGFjcm9zcyhhbGxfb2YoY29sc19udW0pLCBtZWFuKSkKICAKICBuZXdfZGF0YXNldCRNb250aCA8LSBhcy5EYXRlKHBhc3RlKG5ld19kYXRhc2V0JE1vbnRoLCAiMDEiLCBzZXAgPSAiLSIpKQogIAogICMgUmVzdGl0dWlzY2kgaWwgbnVvdm8gZGF0YXNldAogIHJldHVybihuZXdfZGF0YXNldCkKfQpgYGAKCgoKIyMjIEVEQQoKRnJvbSBkYXkgdG8gbW9udGgKYGBge3J9CmJ0Y19wcmljZSA8LSBtb250aGx5KGJ0Y19wcmljZSwgIkRhdGVUaW1lIikKYnRjX2FkZHJfdG90YWwgPC0gbW9udGhseShidGNfYWRkcl90b3RhbCwgIkRhdGVUaW1lIikKYnRjX2hhc2hyYXRlX2RpZmZpY3VsdHkgPC0gbW9udGhseShidGNfaGFzaHJhdGVfZGlmZmljdWx0eSwgIkRhdGVUaW1lIikKYnRjX3RyYW5zYWN0aW9uIDwtIG1vbnRobHkoYnRjX3RyYW5zYWN0aW9uLCAiRGF0ZVRpbWUiKQpidGNfbWluZXJfcmV3YXJkcyA8LSBtb250aGx5KGJ0Y19taW5lcl9yZXdhcmRzLCAiRGF0ZVRpbWUiKQpidGNfYXZnX2ZlZXMgPC0gbW9udGhseShidGNfYXZnX2ZlZXMsICJEYXRlVGltZSIpCiNidGNfZGF5c19oYWx2aW5nIDwtIG1vbnRobHkoYnRjX2RheXNfaGFsdmluZywgImRhdGUiKQpgYGAKCkdsb2JhbCBkYXRlCmBgYHtyfQpzdGFydF9kYXRlIDwtIGFzLkRhdGUoIjIwMTEtMDktMDEiKSAjIDIwMTEtMDktMDEKZW5kX2RhdGUgPC0gYXMuRGF0ZSgiMjAyMy0xMC0wMSIpICMgMjAyMy0xMC0wMQpgYGAKCkRhdGUKYGBge3J9CmJ0Y19wcmljZSA8LSBidGNfcHJpY2VbYnRjX3ByaWNlJE1vbnRoID49IHN0YXJ0X2RhdGUgJiBidGNfcHJpY2UkTW9udGggPD0gZW5kX2RhdGUsIF0gIyBwcmljZQpkb2xsYXJfY2lyY3VsYXRpb24gPC0gZG9sbGFyX2NpcmN1bGF0aW9uW2RvbGxhcl9jaXJjdWxhdGlvbiREQVRFID49IHN0YXJ0X2RhdGUgJiBkb2xsYXJfY2lyY3VsYXRpb24kREFURSA8PSBlbmRfZGF0ZSwgXSAjIHByaWNlCmJ0Y19hZGRyX3RvdGFsIDwtIGJ0Y19hZGRyX3RvdGFsW2J0Y19hZGRyX3RvdGFsJE1vbnRoID49IHN0YXJ0X2RhdGUgJiBidGNfYWRkcl90b3RhbCRNb250aCA8PSBlbmRfZGF0ZSwgXSAjIHByaWNlCmJ0Y19oYXNocmF0ZV9kaWZmaWN1bHR5IDwtIGJ0Y19oYXNocmF0ZV9kaWZmaWN1bHR5W2J0Y19oYXNocmF0ZV9kaWZmaWN1bHR5JE1vbnRoID49IHN0YXJ0X2RhdGUgJiBidGNfaGFzaHJhdGVfZGlmZmljdWx0eSRNb250aCA8PSBlbmRfZGF0ZSwgXSAjIHByaWNlCmJ0Y190cmFuc2FjdGlvbiA8LSBidGNfdHJhbnNhY3Rpb25bYnRjX3RyYW5zYWN0aW9uJE1vbnRoID49IHN0YXJ0X2RhdGUgJiBidGNfdHJhbnNhY3Rpb24kTW9udGggPD0gZW5kX2RhdGUsIF0gIyBwcmljZQoKYnRjX21pbmVyX3Jld2FyZHMgPC0gYnRjX21pbmVyX3Jld2FyZHNbYnRjX21pbmVyX3Jld2FyZHMkTW9udGggPj0gc3RhcnRfZGF0ZSAmIGJ0Y19taW5lcl9yZXdhcmRzJE1vbnRoIDw9IGVuZF9kYXRlLCBdICMgcHJpY2UKYGBgCgpFcnJvciBpbiBidGNfbWluZXJfcmV3YXJkcwpgYGB7cn0KbnJvd3MgPC0gbnJvdyhidGNfbWluZXJfcmV3YXJkcykKcm93X3ByZSA8LSBidGNfbWluZXJfcmV3YXJkc1sobnJvd3MgLSAyOSk6KG5yb3dzIC0gMTUpLCAtMV0KYnRjX21pbmVyX3Jld2FyZHNbKG5yb3dzIC0gMTQpOm5yb3dzLCAtMV0gPC0gcm93X3ByZQpgYGAKCkxvZyBEYXRhCmBgYHtyfQpidGNfcHJpY2UkbG9nX1ByaWNlIDwtIGxvZyhidGNfcHJpY2UkUHJpY2UpCmRvbGxhcl9jaXJjdWxhdGlvbiRsb2dfQ1VSUkNJUiA8LSBsb2coZG9sbGFyX2NpcmN1bGF0aW9uJENVUlJDSVIpCmJ0Y19hZGRyX3RvdGFsJGxvZ190b3RhbCA8LSBsb2coYnRjX2FkZHJfdG90YWwkVG90YWwuV2l0aC5CYWxhbmNlKQpidGNfaGFzaHJhdGVfZGlmZmljdWx0eSRsb2dfSGFzaFJhdGUgPC0gbG9nKGJ0Y19oYXNocmF0ZV9kaWZmaWN1bHR5JEhhc2guUmF0ZSkKYnRjX3RyYW5zYWN0aW9uJGxvZ190cmFuc2FjdGlvbiA8LSBsb2coYnRjX3RyYW5zYWN0aW9uJE51bWJlci5PZi5UcmFuc2FjdGlvbnMpCmJ0Y19taW5lcl9yZXdhcmRzJGxvZ19SZXdhcmRzIDwtIGxvZyhidGNfbWluZXJfcmV3YXJkcyRSZXdhcmRzKQpgYGAKClBsb3QKYGBge3J9CmdncGxvdChidGNfcHJpY2UsIGFlcyh4ID0gTW9udGgsIHkgPSBsb2dfUHJpY2UpKSArCiAgZ2VvbV9saW5lKGNvbG9yID0gIm9yYW5nZSIsIHNpemUgPSAxKSArCiAgbGFicyh4ID0gIkRhdGUiLCB5ID0gIlByaWNlIEJpdGNvaW4iLCB0aXRsZSA9ICJCaXRjb2luIHByaWNlIG92ZXIgdGltZSIpCmBgYAoKUGxvdApgYGB7cn0KZ2dwbG90KCkgKwogIGdlb21fbGluZShkYXRhID0gYnRjX3ByaWNlLCBhZXMoeCA9IE1vbnRoLCB5ID0gbm9ybShsb2dfUHJpY2UpKSwgY29sb3IgPSAib3JhbmdlIiwgc2l6ZSA9IDEsIGxpbmV0eXBlID0gInNvbGlkIikgKwogIGdlb21fbGluZShkYXRhID0gZG9sbGFyX2NpcmN1bGF0aW9uLCBhZXMoeCA9IGFzLkRhdGUoREFURSksIHkgPSBub3JtKGxvZ19DVVJSQ0lSKSksIGNvbG9yID0gInJlZCIsIHNpemUgPSAwLjIsIGxpbmV0eXBlID0gInNvbGlkIikgKwogIGdlb21fbGluZShkYXRhID0gYnRjX2FkZHJfdG90YWwsIGFlcyh4ID0gTW9udGgsIHkgPSBub3JtKGxvZ190b3RhbCkpLCBjb2xvciA9ICJncmVlbiIsIHNpemUgPSAwLjIsIGxpbmV0eXBlID0gInNvbGlkIikgKwogIGdlb21fbGluZShkYXRhID0gYnRjX3RyYW5zYWN0aW9uLCBhZXMoeCA9IE1vbnRoLCB5ID0gbm9ybShsb2dfdHJhbnNhY3Rpb24pKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4yLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGJ0Y19oYXNocmF0ZV9kaWZmaWN1bHR5LCBhZXMoeCA9IE1vbnRoLCB5ID0gbm9ybShsb2dfSGFzaFJhdGUpKSwgY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAwLjIsIGxpbmV0eXBlID0gInNvbGlkIikgKwogIGdlb21fbGluZShkYXRhID0gYnRjX21pbmVyX3Jld2FyZHMsIGFlcyh4ID0gTW9udGgsIHkgPSBub3JtKGxvZ19SZXdhcmRzKSksIGNvbG9yID0gImJsdWUiLCBzaXplID0gMC4yLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsKCiAgbGFicyh4ID0gIkRhdGUiLCB5ID0gIkxvZyhQcmljZSkiLCB0aXRsZSA9ICJCaXRjb2luIFByaWNlIGFuZCBvdGhlciBUaW1lIFNlcmllcyIpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICJMZWdlbmQiLCB2YWx1ZXMgPSBjKCJzb2xpZCIsICJkYXNoZWQiKSwgbGFiZWxzID0gYygiQml0Y29pbiBQcmljZSIsICJBbm90aGVyIFRpbWUgU2VyaWVzIikpCmBgYAoKQ3JlYXRlIERhdGFzZXQKYGBge3J9CmRhdGFzZXRfbG9nIDwtIGRhdGEuZnJhbWUocHJpY2UgPSBidGNfcHJpY2UkbG9nX1ByaWNlLCAKICAgICAgICAgICAgICAgICAgICAgIGRvbGxhcl9jaXJjdWxhdGlvbiA9IGRvbGxhcl9jaXJjdWxhdGlvbiRsb2dfQ1VSUkNJUiwKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2FkZHIgPSBidGNfYWRkcl90b3RhbCRsb2dfdG90YWwsCiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiA9IGJ0Y190cmFuc2FjdGlvbiRsb2dfdHJhbnNhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICBoYXNocmF0ZSA9IGJ0Y19oYXNocmF0ZV9kaWZmaWN1bHR5JGxvZ19IYXNoUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgIHJld2FyZHMgPSBidGNfbWluZXJfcmV3YXJkcyRsb2dfUmV3YXJkcykKCmRhdGFzZXQgPC0gZGF0YS5mcmFtZShwcmljZSA9IGJ0Y19wcmljZSRQcmljZSwgCiAgICAgICAgICAgICAgICAgICAgICBkb2xsYXJfY2lyY3VsYXRpb24gPSBkb2xsYXJfY2lyY3VsYXRpb24kQ1VSUkNJUiwKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2FkZHIgPSBidGNfYWRkcl90b3RhbCRUb3RhbC5XaXRoLkJhbGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiA9IGJ0Y190cmFuc2FjdGlvbiROdW1iZXIuT2YuVHJhbnNhY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgaGFzaHJhdGUgPSBidGNfaGFzaHJhdGVfZGlmZmljdWx0eSRIYXNoLlJhdGUsCiAgICAgICAgICAgICAgICAgICAgICByZXdhcmRzID0gYnRjX21pbmVyX3Jld2FyZHMkUmV3YXJkcykKYGBgCgoKYGBge3J9CmFjZihkYXRhc2V0JHByaWNlKQptYXQgPC0gY29yKGRhdGFzZXQpCgpjb3JycGxvdChtYXQsIG1ldGhvZCA9ICJjb2xvciIsIGFkZENvZWYuY29sID0gImJsYWNrIikKYGBgCgpEaWZmZXJlbnRhdGlvbgpgYGB7cn0KZGF0YXNldCRwcmljZV9kaWZmIDwtIGMoTkEsIGRpZmYoZGF0YXNldCRwcmljZSkpCmRhdGFzZXQkZG9sbGFyX2NpcmN1bGF0aW9uX2RpZmYgPC0gYyhOQSwgZGlmZihkYXRhc2V0JGRvbGxhcl9jaXJjdWxhdGlvbikpCmRhdGFzZXQkdG90YWxfYWRkcl9kaWZmIDwtIGMoTkEsIGRpZmYoZGF0YXNldCR0b3RhbF9hZGRyKSkKZGF0YXNldCR0cmFuc2FjdGlvbl9kaWZmIDwtIGMoTkEsIGRpZmYoZGF0YXNldCR0cmFuc2FjdGlvbikpCmRhdGFzZXQkaGFzaHJhdGVfZGlmZiA8LSBjKE5BLCBkaWZmKGRhdGFzZXQkaGFzaHJhdGUpKQpkYXRhc2V0JHJld2FyZHNfZGlmZiA8LSBjKE5BLCBkaWZmKGRhdGFzZXQkcmV3YXJkcykpCmBgYAoKYGBge3J9CiMgUmltdW92aSBsZSB2YXJpYWJpbGkgdGVtcG9yYWxpIG9yaWdpbmFsaQpkYXRhc2V0X3NlbnphX3RlbXBvIDwtIHN1YnNldChkYXRhc2V0LCBzZWxlY3QgPSAtYyhwcmljZSwgZG9sbGFyX2NpcmN1bGF0aW9uLCB0b3RhbF9hZGRyLCB0cmFuc2FjdGlvbiwgaGFzaHJhdGUsIHJld2FyZHMpKQojIENhbGNvbGEgbGEgbWF0cmljZSBkaSBjb3JyZWxhemlvbmUKbWF0cml4X2NvcnJlbGF6aW9uZSA8LSBjb3IoZGF0YXNldF9zZW56YV90ZW1wbywgdXNlID0gImNvbXBsZXRlLm9icyIpCiMgVmlzdWFsaXp6YSBsYSBtYXRyaWNlIGRpIGNvcnJlbGF6aW9uZQpwcmludChtYXRyaXhfY29ycmVsYXppb25lKQpjb3JycGxvdChtYXRyaXhfY29ycmVsYXppb25lLCBtZXRob2QgPSAiY29sb3IiLCBhZGRDb2VmLmNvbCA9ICJibGFjayIpCgpgYGAKCgoKIyMjIExpbmVhciBSZWdyZXNzaW9uCgpgYGB7cn0KcHJpY2UgPC0gbG9nKGRhdGFzZXQkcHJpY2UpCnR0IDwtIDE6TlJPVyhkYXRhc2V0KQoKcGxvdCh0dCwgcHJpY2UsIHhsYWI9IlRpbWUiLCB5bGFiPSJCaXRjb2luIHByaWNlIikKYGBgCmF1dG9jb3JyZWxhdGlvbiBmdW5jdGlvbgpgYGB7cn0KYWNmKHByaWNlKQpgYGAKCmZpdCBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIApgYGB7cn0KZml0MSA8LSBsbShwcmljZX4gdHQpCnN1bW1hcnkoZml0MSkKYGBgCgpgYGB7cn0KcGxvdCh0dCwgcHJpY2UsIHhsYWI9IlRpbWUiLCB5bGFiPSJCaXRjb2luIHByaWNlIikKYWJsaW5lKGZpdDEsIGNvbD0zKQpgYGAKCmNoZWNrIHRoZSByZXNpZHVhbHM/IGFyZSB0aGV5IGF1dG9jb3JyZWxhdGVkPyBUZXN0IG9mIERXCmBgYHtyfQpkd3Rlc3QoZml0MSkKYGBgCgpjaGVjayB0aGUgcmVzaWR1YWxzCmBgYHtyfQpyZXNmaXQxPC0gcmVzaWR1YWxzKGZpdDEpCnBsb3QocmVzZml0MSx4bGFiPSJUaW1lIiwgeWxhYj0icmVzaWR1YWxzIiApCmBgYAoKbGV0IHVzIGRvIHRoZSBzYW1lIHdpdGggYSBsaW5lYXIgbW9kZWwgZm9yIHRpbWUgc2VyaWVzLCBzbyB3ZSB0cmFuc2Zvcm0gdGhlIGRhdGEgaW50byBhICd0cycgb2JqZWN0CmBgYHtyfQpwcmljZS50cyA8LSB0cyhwcmljZSwgZnJlcXVlbmN5ID0gNCkKdHMucGxvdChwcmljZS50cywgdHlwZT0ibyIpCgojIyB3ZSBmaXQgYSBsaW5lYXIgbW9kZWwgd2l0aCB0aGUgdHNsbSBmdW5jdGlvbgpmaXR0czwtIHRzbG0ocHJpY2UudHN+dHJlbmQpCgojIyNvYnZpb3VzbHkgaXQgZ2l2ZXMgdGhlIHNhbWUgcmVzdWx0cyBvZiB0aGUgZmlyc3QgbW9kZWwKc3VtbWFyeShmaXR0cykKCmR3dGVzdChmaXR0cykKYGBgCgoKCiMjIyBMaW5lYXIgcmVncmVzc2lvbiB3aXRoIHRyZW5kIGFuZCBzZWFzb25hbGl0eSBhbmQgZm9yZWNhc3RpbmcgZXhlcmNpc2UgCgpgYGB7cn0KI3Rha2UgYSBwb3J0aW9uIG9mIGRhdGEgYW5kIGZpdCBhIGxpbmVhciBtb2RlbCB3aXRoIHRzbG0KcHJpY2UxIDwtIHdpbmRvdyhwcmljZS50cywgc3RhcnQ9MSwgZW5kPTMxIC0uMSkKcGxvdChwcmljZTEpCmBgYAoKYGBge3J9Cm0xPC0gdHNsbShwcmljZTEgfiB0cmVuZCtzZWFzb24pCnN1bW1hcnkobTEpCmZpdDwtIGZpdHRlZChtMSkKCnBsb3QocHJpY2UxKQpsaW5lcyhmaXR0ZWQobTEpLCBjb2w9MikKCmZvcmUgPC0gZm9yZWNhc3QobTEpCnBsb3QoZm9yZSkKYGBgCgpgYGB7cn0KI2FuYWx5c2lzIG9mIHJlc2lkdWFscwpyZXM8LSByZXNpZHVhbHMobTEpIApwbG90KHJlcykgCiN0aGUgZm9ybSBvZiByZXNpZHVhbHMgc2VlbXMgdG8gaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIG5lZ2F0aXZlIGF1dG9jb3JyZWxhdGlvbgpBY2YocmVzKQoKZHc8LSBkd3Rlc3QobTEsIGFsdD0idHdvLnNpZGVkIikKZHcKYGBgCgoKIyMjIE5vbmxpbmVhciBtb2RlbHMgZm9yIG5ldyBwcm9kdWN0IGdyb3d0aCAoZGlmZnVzaW9uIG1vZGVscykKCmBgYHtyfQpibV90dzwtQk0ocHJpY2UsZGlzcGxheSA9IFQpCnN1bW1hcnkoYm1fdHcpCgoKcHJlZF9ibXR3PC0gcHJlZGljdChibV90dywgbmV3eD1jKDE6MTQ2KSkKcHJlZC5pbnN0dHc8LSBtYWtlLmluc3RhbnRhbmVvdXMocHJlZF9ibXR3KQoKCnBsb3QocHJpY2UsIHR5cGU9ICJiIix4bGFiPSJRdWFydGVyIiwgeWxhYj0iUXVhcnRlcmx5IHJldmVudWVzIiwgIHBjaD0xNiwgbHR5PTMsIGNleD0wLjYsIHhsaW09YygxLDE0NikpCmxpbmVzKHByZWQuaW5zdHR3LCBsd2Q9MiwgY29sPTIpCgoKIyMjR0JNcjEKR0JNcjF0dzwtIEdCTShwcmljZSxzaG9jayA9ICJyZXR0Iixuc2hvY2sgPSAxLHByZWxpbWVzdGltYXRlcyA9IGMoNC40NjMzNjhlKzA0LCAxLjkyMzU2MGUtMDMsIDkuMTQyMDIyZS0wMiwgMjQsMzgsLTAuMSkpCgoKIyMjIyMjR0JNZTEKCkdCTWUxdHc8LSBHQk0ocHJpY2Usc2hvY2sgPSAiZXhwIixuc2hvY2sgPSAxLHByZWxpbWVzdGltYXRlcyA9IGMoNC40NjMzNjhlKzA0LCAxLjkyMzU2MGUtMDMsIDkuMTQyMDIyZS0wMiwgMTIsMC4xLDAuMSkpCnN1bW1hcnkoR0JNZTF0dykKCnByZWRfR0JNZTF0dzwtIHByZWRpY3QoR0JNZTF0dywgbmV3eD1jKDE6MTQ2KSkKcHJlZF9HQk1lMXR3Lmluc3Q8LSBtYWtlLmluc3RhbnRhbmVvdXMocHJlZF9HQk1lMXR3KQoKcGxvdChwcmljZSwgdHlwZT0gImIiLHhsYWI9IlF1YXJ0ZXIiLCB5bGFiPSJRdWFydGVybHkgcmV2ZW51ZXMiLCAgcGNoPTE2LCBsdHk9MywgY2V4PTAuNiwgeGxpbT1jKDEsMTQ2KSkKbGluZXMocHJlZF9HQk1lMXR3Lmluc3QsIGx3ZD0yLCBjb2w9MikKCmBgYApgYGB7cn0KIyMjIyMjR0dNIApHR01fdHc8LSBHR00ocHJpY2UsIHByZWxpbWVzdGltYXRlcz1jKDQuNDYzMzY4ZSswNCwgMC4wMDEsIDAuMDEsIDEuOTIzNTYwZS0wMywgOS4xNDIwMjJlLTAyKSkKc3VtbWFyeShHR01fdHcpCgpwcmVkX0dHTV90dzwtIHByZWRpY3QoR0dNX3R3LCBuZXd4PWMoMToxNDYpKQpwcmVkX0dHTV90dy5pbnN0PC0gbWFrZS5pbnN0YW50YW5lb3VzKHByZWRfR0dNX3R3KQoKcGxvdChwcmljZSwgdHlwZT0gImIiLHhsYWI9IlF1YXJ0ZXIiLCB5bGFiPSJRdWFydGVybHkgcmV2ZW51ZXMiLCAgcGNoPTE2LCBsdHk9MywgY2V4PTAuNiwgeGxpbT1jKDEsMTQ2KSkKbGluZXMocHJlZF9HR01fdHcuaW5zdCwgbHdkPTIsIGNvbD0yKQpsaW5lcyhwcmVkLmluc3R0dywgbHdkPTIsIGNvbD0zKQoKIyMjQW5hbHlzaXMgb2YgcmVzaWR1YWxzCnJlc19HR010dzwtIHJlc2lkdWFscyhHR01fdHcpCmFjZjwtIGFjZihyZXNpZHVhbHMoR0dNX3R3KSkKCgpmaXRfR0dNdHc8LSBmaXR0ZWQoR0dNX3R3KQpmaXRfR0dNdHdfaW5zdDwtIG1ha2UuaW5zdGFudGFuZW91cyhmaXRfR0dNdHcpCmBgYApgYGB7cn0KIyMjI1NBUk1BWCByZWZpbmluZwpsaWJyYXJ5KGZvcmVjYXN0KQojIyMjU0FSTUFYIG1vZGVsIHdpdGggZXh0ZXJuYWwgY292YXJpYXRlICdmaXRfR0dNJyAKczIgPC0gQXJpbWEoY3Vtc3VtKHByaWNlKSwgb3JkZXIgPSBjKDMsMCwxKSwgc2Vhc29uYWw9bGlzdChvcmRlcj1jKDMsMCwxKSwgcGVyaW9kPTQpLHhyZWcgPSBmaXRfR0dNdHcpCnN1bW1hcnkoczIpCnByZXMyIDwtIG1ha2UuaW5zdGFudGFuZW91cyhmaXR0ZWQoczIpKQoKCnBsb3QocHJpY2UsIHR5cGU9ICJiIix4bGFiPSJRdWFydGVyIiwgeWxhYj0iUXVhcnRlcmx5IHJldmVudWVzIiwgIHBjaD0xNiwgbHR5PTMsIHhheHQ9Im4iLCBjZXg9MC42KQpsaW5lcyhmaXRfR0dNdHdfaW5zdCwgbHdkPTEsIGx0eT0yKQpsaW5lcyhwcmVzMiwgbHR5PTEsbHdkPTEpCmBgYAoKIyMjIEFSSU1BIG1vZGVscwoKYGBge3J9CmxpYnJhcnkoZnBwMikKbGlicmFyeShmb3JlY2FzdCkgCj9mcHAyCgpwbG90KHByaWNlKQpBY2YocHJpY2UpClBhY2YocHJpY2UpCnByaWNldHM8LSB0c2Rpc3BsYXkocHJpY2UpCmBgYAoKYGBge3J9CiMjI0dlbmVyYWwgaW5kaWNhdGlvbjogaWYgdGhlIEFDRiBpcyBleHBvbmVudGlhbGx5IGRlY2F5aW5nIG9yIHNpbnVzb2lkYWwgYW5kIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgc3Bpa2UgYXQgbGFnIHAgaW4gUEFDRiBhbmQgbm90aGluZyBlbHNlLCAKIyNpdCBtYXkgYmUgYW4gQVJNQShwLGQsMCkuIElmIHRoZSBQQUNGIGlzIGV4cG9uZW50aWFsbHkgZGVjYXlpbmcgb3Igc2ludXNvaWRhbCBhbmQgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBzcGlrZSBhdCBsYWcgcCBpbiBBQ0YgYW5kIG5vdGhpbmcgZWxzZSwgaXQgbWF5IGJlIGFuIEFSTUEoMCxkLHEpLiAKCmFyaW1hMTwtIEFyaW1hKHByaWNlLCBvcmRlcj1jKDAsMCwzKSkKc3VtbWFyeShhcmltYTEpCgpyZXNpZDE8LSByZXNpZHVhbHMoYXJpbWExKQp0c2Rpc3BsYXkocmVzaWQxKQoKCnBsb3QocHJpY2UpCmxpbmVzKGZpdHRlZChhcmltYTEpLCBjb2w9MikKCmZvcjE8LSBmb3JlY2FzdChhcmltYTEpCnBsb3QoZm9yMSkKYGBgCgoKRmlyc3QgQXJpbWEgbW9kZWwKYGBge3J9CnBsb3QocHJpY2UsIHlsYWI9InJldGFpbCBpbmRleCIseGxhYj0ieWVhciIpCnRzZGlzcGxheShwcmljZSkKCiMjZmlyc3QgZGlmZmVyZW5jZQpkaWZmMTwtIGRpZmYocHJpY2UpIAojIyNzZWFzb25hbCBkaWZmZXJlbmNlCmRpZmY0PC0gZGlmZihwcmljZSwgbGFnPTQpIAp0c2Rpc3BsYXkoZGlmZjEpCnRzZGlzcGxheShkaWZmNCkKCgojIyMjZmlyc3QgQXJpbWEgbW9kZWwgCmExPC0gQXJpbWEocHJpY2UsIG9yZGVyPWMoMCwxLDEpLCBzZWFzb25hbD1jKDAsMCwxKSkKZml0MTwtIGZpdHRlZChhMSkKCnBsb3QocHJpY2UpCmxpbmVzKGZpdDEsIGNvbD0yKQoKZjE8LSBmb3JlY2FzdChhMSkKcGxvdChmMSkKCnIxPC0gcmVzaWR1YWxzKGExKQp0c2Rpc3BsYXkocjEpIApgYGAKClNlY29uZCBBcmltYSBtb2RlbApgYGB7cn0KYTI8LSBBcmltYShwcmljZSwgb3JkZXI9YygwLDEsMSksIHNlYXNvbmFsPWMoMCwwLDIpKQpmaXQyPC0gZml0dGVkKGEyKQoKcGxvdChwcmljZSkKbGluZXMoZml0MiwgY29sPTIpCgpmMjwtIGZvcmVjYXN0KGEyKQpwbG90KGYyKQoKcjI8LSByZXNpZHVhbHMoYTIpCnRzZGlzcGxheShyMikgCmBgYAoKVGhpcmQgQXJpbWEgbW9kZWwKYGBge3J9CmEzPC0gQXJpbWEocHJpY2UsIG9yZGVyPWMoMCwxLDEpLCBzZWFzb25hbD1jKDAsMSwxKSkKZml0MzwtIGZpdHRlZChhMykKCnBsb3QocHJpY2UpCmxpbmVzKGZpdDMsIGNvbD0yKQoKZjM8LSBmb3JlY2FzdChhMykKcGxvdChmMykKCnIzPC0gcmVzaWR1YWxzKGEzKQp0c2Rpc3BsYXkocjMpIApgYGAKRm91cnRoIEFyaW1hIG1vZGVsCmBgYHtyfQphNDwtIEFyaW1hKHByaWNlLCBvcmRlcj1jKDAsMSwyKSwgc2Vhc29uYWw9YygwLDEsMSkpCmZpdDQ8LSBmaXR0ZWQoYTQpCgpwbG90KHByaWNlKQpsaW5lcyhmaXQ0LCBjb2w9MikKCmY0PC0gZm9yZWNhc3QoYTQpCmF1dG9wbG90KGY0KQoKcjQ8LSByZXNpZHVhbHMoYTQpCnRzZGlzcGxheShyNCkgCmBgYAoKRmlmdGggQXJpbWEgbW9kZWwKYGBge3J9CmF1dG8uYTwtIGF1dG8uYXJpbWEocHJpY2UpCmF1dG8uYQoKYXV0b3Bsb3QoZm9yZWNhc3QoYXV0by5hKSkKY2hlY2tyZXNpZHVhbHMoYXV0by5hKQpgYGAKCmBgYHtyfQojI3Bsb3Qgb2Ygc2Vhc29uYWwgZGlmZmVyZW50aWF0ZWQgZGF0YSwgd2l0aCBBQ0YgYW5kIFBBQ0YKdHNkaXNwbGF5KGRpZmYocHJpY2UsMTIpLCBtYWluPSJzZWFzb25hbCBkaWZmZXJlbmNlZCBkYXRhIiwgeGxhYj0ieWVhciIpCgojI1dlIGZpdCBhbiBBUklNQSBtb2RlbCBiYXNlIG9uIHRoZSBpbnNwZWN0aW9uIG9mIEFDRiBhbmQgUEFDRiB3aXRoIDMgQVIgY29tcG9uZW50cwpmaXQ8LSBBcmltYShwcmljZSwgb3JkZXI9YygzLDAsMSksc2Vhc29uYWw9YygwLDEsMiksIGxhbWJkYT0wKQpzdW1tYXJ5KGZpdCkKCiMjQ2hlY2sgcmVzaWR1YWxzCnRzZGlzcGxheShyZXNpZHVhbHMoZml0KSkKQm94LnRlc3QocmVzaWR1YWxzKGZpdCksIGxhZz0zNixmaXRkZj02LCB0eXBlPSJManVuZyIpCgoKIyNwZXJmb3JtIHRoZSBmb3JlY2FzdGluZwpmPC0gZm9yZWNhc3QoZml0KQoKcGxvdChmLCB5bGFiPSJzYWxlcyIsIHhsYWI9InllYXIiKQpgYGAKCmBgYHtyfQphaXIubW9kZWwgPC0gQXJpbWEod2luZG93KHByaWNlLGVuZD0xNDYpLG9yZGVyPWMoMCwxLDEpLAogICAgICAgICAgICAgICAgICAgc2Vhc29uYWw9bGlzdChvcmRlcj1jKDAsMSwxKSxwZXJpb2Q9MTIpLGxhbWJkYT0wKQpwbG90KGZvcmVjYXN0KGFpci5tb2RlbCxoPTI0KSkKbGluZXMocHJpY2UpCgojIEFwcGx5IGZpdHRlZCBtb2RlbCB0byBsYXRlciBkYXRhCmFpci5tb2RlbDIgPC0gQXJpbWEod2luZG93KHByaWNlLHN0YXJ0PTEpLG1vZGVsPWFpci5tb2RlbCkKCiMgaW4tc2FtcGxlIG9uZS1zdGVwIGZvcmVjYXN0cwphY2N1cmFjeShhaXIubW9kZWwpCiMgb3V0LW9mLXNhbXBsZSBvbmUtc3RlcCBmb3JlY2FzdHMKYWNjdXJhY3koYWlyLm1vZGVsMikKYGBgCgojIyMgQVJNQVggTW9kZWxzCgpgYGB7cn0KYXJtYXgxPC0gQXJpbWEocHJpY2UsIHhyZWc9ZGF0YXNldF9sb2ckZG9sbGFyX2NpcmN1bGF0aW9uLCBvcmRlcj1jKDEsMCwxKSkKcmVzMTwtIHJlc2lkdWFscyhhcm1heDEpCkFjZihyZXMxKQoKZml0dGVkKGFybWF4MSkKcGxvdChwcmljZSkKbGluZXMoZml0dGVkKGFybWF4MSksIGNvbD0yKQpgYGAKCg==